/*
 * smushit-cli - A command line tool for the Yahoo! Smush.it API
 *
 * Copyright (c) 2010 Benjamin Schneider
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "Application.h"

#include <iostream>
#include "ApplicationInfo.h"
#include "CurlErrorException.h"
#include "FilesizeCalculator.h"
#include "ImageUploader.h"
#include "ImageDownloader.h"
#include "Options.h"
#include "SmushResult.h"

using std::cerr;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;

namespace smushit_cli {

Application::Application() {

    initCurl();
}

Application::~Application() {

    cleanupCurl();
}

void Application::run(int argc, char** argv) {

    cout << endl;

    try {

        printSignature();

        Options options;

        if (argc <= 1) {

            cout << options.getUsageInfo();

        } else {

            options.parse(argc, argv);

            if (options.helpRequested()) {

                cout << options.getUsageInfo();

            } else {

                runSmushIt(options.getInputFile(), options.getOutputFile());
            }
        }

    } catch (std::exception& ex) {

        cerr << "Error: " << ex.what() << endl;
    }

    cout << endl;
}

void Application::initCurl() {

    long flags = CURL_GLOBAL_NOTHING;

#ifdef WIN32
    flags = CURL_GLOBAL_WIN32;
#endif

    SAFE_CURL(curl_global_init(flags));
}

void Application::cleanupCurl() {

    curl_global_cleanup();
}

void Application::runSmushIt(const string& input, const string& output) {

    ImageUploader   uploader;
    ImageDownloader downloader;

    cout << "[1] Uploading " << input << "..." << endl << "    ";
    SmushResult result = uploader.uploadImage(input);

    if (result.error.empty()) {

        FilesizeCalculator calc;

        cout << "Smushed from "
             << result.src_size << "B to "
             << result.dest_size << "B ("
             << calc.getDifferenceInPercent(result.src_size, result.dest_size)
             << ")" << endl << endl;
        
        cout << "[2] Downloading result to " << output << "..." << endl << "    ";
        downloader.downloadImage(result.dest, output);
        cout << "Done" << endl;

    } else {

        cout << result.error << endl;
    }
}

void Application::printSignature() const {

    ApplicationInfo& info = ApplicationInfo::getInstance();

    cout << info.getExecutableName() << " v" << info.getVersion() << endl << endl;
}

}

